package com.jml.spi;


import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * @author:jml
 * @date: 2019/5/21 20:28
 * @description：
 */
public class SPIMain {

    public static void main(String[] args) throws InterruptedException {
        //把当前线程的类加载器设置为扩展类加载器，
        //因为接口是应用类加载器所有如果使用扩展类加载器是获取不到这个类的，不在加载器的范围之内。
        //不设置就可以找到
        Thread.currentThread().setContextClassLoader(SPIMain.class.getClassLoader().getParent());
        //使用启动的类加载器就可以正常使用，因为这个是null，里面有判断如果为null的时候就默认使用系统类加载器
        //系统类加载器SystemClassLoader就是使用的Launcher中的loader属性，这里返回的就是应用类加载器，在初始化类的时候就这只了。
        Thread.currentThread().setContextClassLoader(SPIMain.class.getClassLoader().getParent().getParent());

        ServiceLoader<DubboService> spiLoader = ServiceLoader.load(DubboService.class);
        //普通循环
        spiLoader.forEach((DubboService t) -> {
            t.sayHello();
        });
        //遍历器循环
        ServiceLoader<DubboService> spiLoader001 = ServiceLoader.load(DubboService.class);
        Iterator<DubboService> iteratorSpi001=spiLoader001.iterator();
        while (iteratorSpi001.hasNext()){
            DubboService dubboService=iteratorSpi001.next();
            dubboService.sayHello();
        }
    }
}
